﻿/* dk2Repository - Copyright (C) 2011 Daniel Kuczewski http://www.dk2.de/

 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */

using dk2Repository.Interfaces;

namespace dk2Repository
{
    internal sealed class HashCodeTracker : IChangeTracker
    {
        private readonly object _item;
        private readonly IMapping _mapping;
        private int _hashcode;

        public bool HasChanged
        {
            get { return !_hashcode.Equals(GetHash()); }
        }


        internal HashCodeTracker(IMapping mapping, object item)
        {
            _mapping = mapping;
            _item = item;
            _hashcode = 0;

        }

        public void Reset()
        {
            _hashcode = GetHash();
        }

        private int GetHash()
        {
            int i = 123.GetHashCode();

            foreach (var mapping in _mapping.Columns)
            {
                var value = mapping.GetValue(_item);
                if(value!=null)
                    i ^= (value.GetHashCode());
            }

            return i;

        }


    }
}
